//
//  ViewController.m
//  RunTime
//
//  Created by 吴志勇 on 2020/3/21.
//  Copyright © 2020 wzy. All rights reserved.
//


#import "ViewController.h"
#import <objc/message.h>
#import "Person.h"
#import "Student.h"



/*
 *任何方法调用本质：发送一个消息，用runtime发送消息，OC底层实现通过runtime实现
 *runtime都有一个前缀，谁的事情使用谁 一般都是针对系统的类
 */

/**
 *Runtime(动态添加方法):OC都是懒加载机制，只要一个方法实现了，就会马上添加到方法列表中 
 *performSelector-->动态添加方法的时候使用 --->用runtime
 *
 *动态添加属性
 
 */

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    /**
     *需要用到runtime，消息机制
     *可以直接调用私有方法
     *
     */


    Person *p = objc_msgSend(objc_getClass("Person"), sel_registerName("alloc"));
    p = objc_msgSend(p, sel_registerName("init"));
    objc_msgSend(p, sel_registerName("eat"));
    
    objc_msgSend(p, @selector(run:),20);
    
//    方法调用流程
//    怎么去x调用eat方法，对象方法：类对象的方法列表 类方法：元类中方法列表
//    1.通过isa去对应的类中查找
//    2.注册方法编号
//    3.根据方法编号去查找对应方法
//    4.找到的只是最终函数实现地址，根据地址去方法区调用对应函数
/**
    内容5大区
     1.栈 2.堆 3.静态区 4.常量区 5.方法区
        栈：不需要手动管理内存，自动管理
        堆：需要手动管理内存，自己去释放
 */
    
   
    

    /**
     源对象                    c拷贝方法                 副本对象                是否产生新对象                 拷贝类型
     NS*                           copy                          NS*                              否     浅拷贝(指针拷贝)
     NS*                      mutableCopy              NSMutable*                     是                        深拷贝(内容拷贝)
     NSMutable*             copy                          NS*                                是                        浅拷贝(内容拷贝)
     NSMutable*         mutableCopy              NSMutable*                     是                        深拷贝(内容拷贝)
     */
    
}


//

//动态添加函数
- (void)addFun{
    Student *s = [[Student alloc] init];
    //执行一个方法
    [s performSelector:@selector(eat)];
}

/**
    runtime(交换方法): 只要修改系统的方法实现
 */
//UIImage判断是否加载图片成功
- (void)ifImage{
    UIImage *image = [UIImage imageNamed:@"1"];
    NSLog(@"%@",image);
}

- (void)test{
    //在build setting里搜索msg 改为no
       id objc = objc_msgSend([NSObject class], @selector(alloc));
       
       objc = objc_msgSend(objc, @selector(init));
}



//动态添加属性:就是让某个属性与对象产生关联
- (void)addAttribute{
    
}
@end
